/**
 * 通用API工具函数
 * 提供基础的HTTP请求方法和配置
 */

// 基础URL配置
const BASE_URL = 'http://localhost:8080';

/**
 * 基础API请求函数
 * @param {string} endpoint - API端点路径
 * @param {Object} options - 请求选项
 * @returns {Promise} - 返回Promise对象
 */
async function apiRequest(endpoint, options = {}) {
    // 构建完整的URL
    const url = `${BASE_URL}${endpoint}`;
    
    // 默认请求选项
    const defaultOptions = {
        method: 'GET',
        headers: {
            'Content-Type': 'application/json'
        },
        credentials: 'include', // 包含Cookie
        mode: 'cors', // 启用CORS
        cache: 'no-cache',
        redirect: 'follow',
        referrerPolicy: 'no-referrer'
    };
    
    // 合并请求选项
    const requestOptions = {
        ...defaultOptions,
        ...options,
        headers: {
            ...defaultOptions.headers,
            ...(options.headers || {})
        }
    };
    
    try {
        // 添加日志记录请求信息
        console.log('API请求URL:', url);
        console.log('请求选项:', JSON.stringify(requestOptions, null, 2));
        
        // 始终携带凭证，确保认证信息正确传递
        const finalOptions = { ...requestOptions };
        // 确保credentials设置为include，这样可以正确传递认证信息
        finalOptions.credentials = 'include';
        const response = await fetch(url, finalOptions);

        // 优先尝试读取响应体（即使非200）
        const tryParseJson = async () => {
            try {
                return await response.json();
            } catch (_) {
                return null;
            }
        };

        if (!response.ok) {
            // 处理CORS相关错误
            if (response.status === 0) {
                throw new Error('CORS策略阻止了请求，请检查服务器CORS配置');
            }
            const errBody = await tryParseJson();
            const msg = errBody && (errBody.message || errBody.error || errBody.status) ? (errBody.message || errBody.error || JSON.stringify(errBody)) : `HTTP错误! 状态码: ${response.status}`;
            const error = new Error(msg);
            error.status = response.status;
            error.body = errBody;
            throw error;
        }

        if (response.status === 204) {
            return {};
        }

        const data = await tryParseJson();
        if (data === null) {
            throw new Error('响应解析错误: 非JSON响应');
        }
        return data;
    } catch (error) {
        // 增强的错误处理
        console.error('API请求失败:', error);
        
        throw error;
    }
}

/**
 * GET请求
 * @param {string} endpoint - API端点路径
 * @param {Object} params - 查询参数
 * @param {Object} options - 其他请求选项
 * @returns {Promise} - 返回Promise对象
 */
async function get(endpoint, params = {}, options = {}) {
    // 构建查询字符串
    const queryString = new URLSearchParams(params).toString();
    const url = queryString ? `${endpoint}?${queryString}` : endpoint;
    
    return apiRequest(url, {
        method: 'GET',
        ...options
    });
}

/**
 * POST请求
 * @param {string} endpoint - API端点路径
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他请求选项
 * @returns {Promise} - 返回Promise对象
 */
async function post(endpoint, data = {}, options = {}) {
    return apiRequest(endpoint, {
        method: 'POST',
        body: JSON.stringify(data),
        ...options
    });
}

/**
 * PUT请求
 * @param {string} endpoint - API端点路径
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他请求选项
 * @returns {Promise} - 返回Promise对象
 */
async function put(endpoint, data = {}, options = {}) {
    return apiRequest(endpoint, {
        method: 'PUT',
        body: JSON.stringify(data),
        ...options
    });
}

/**
 * DELETE请求
 * @param {string} endpoint - API端点路径
 * @param {Object} options - 其他请求选项
 * @returns {Promise} - 返回Promise对象
 */
async function del(endpoint, options = {}) {
    return apiRequest(endpoint, {
        method: 'DELETE',
        ...options
    });
}

// 将API工具函数挂载到全局window对象上，使其可以被其他脚本访问
window.utils = window.utils || {};
window.utils.api = {
    BASE_URL,
    get,
    post,
    put,
    del
};